package com.igeek.boot.controller;

import com.igeek.boot.entity.User;
import org.springframework.stereotype.Controller;
import org.springframework.util.MultiValueMap;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

/**
 * @Author fengqq
 * @Description 参数注解
 * @Date 2024/8/15  11:36
 */
@Controller
public class ParamController {

    //========@PathVariable 路径变量===========
    //测试地址： localhost:8084/path/10/zhangsan
    //要求：
    // 1.url中的{key}占位符  在方法的形参列表中@PathVariable("key")int id获取路径中变量值
    // 2.在方法的形参列表中@PathVariable Map<String,Object> pv 获取所有路径中变量值
    //使用场景：查询指定数据详情 删除指定数据

    @GetMapping("/path/{id}/{name}")
    @ResponseBody
    public Map<String,Object> testPathVariable(
            @PathVariable("id") int id,
            @PathVariable("name") String username,
            @PathVariable Map<String,Object> pv){
        HashMap<String, Object> map = new HashMap<>();
        map.put("id",id);
        map.put("name",username);
        map.put("pv",pv);
        return map;
    }


    //========@RequestHeader 获取请求头========
    //要求：使用@RequestHeader("key") 根据key获取请求头中的对应的值
    //使用场景：从请求头中解析token
    @GetMapping("/head")
    @ResponseBody
    public Map<String,Object> testRequestHeader(
            @RequestHeader("Host") String host,
            @RequestHeader("token") String token
    ){
        HashMap<String, Object> map = new HashMap<>();
        map.put("host",host);
        map.put("token",token);
        return map;
    }

//
    //========@CookieValue 获取Cookie值========
    //要求： @CookieValue("key") 此处的key代表的是 cookie对象的键名称
    //postman添加cookie数据：cookies -->设置doman信息 localhost:8084 --> add cookie username=root; Path=/; Expires=Fri, 15 Aug 2025 06:24:53 GMT;
    /*
    * cookie localStorage sessionStorage的区别:
    *   后端 cookie
    *   前端 localStorage sessionStorage
    * */

    /*添加cookie*/
    @GetMapping("/addCookie")
    public String addCookie(HttpServletResponse response){
        //1.创建cookie对象 封装数据
        Cookie cookie1 = new Cookie("username", "admin");
        Cookie cookie2 = new Cookie("password", "123456");
        //2.通过响应response 将cookie 添加到客户端(后续每次请求将cookie添加到请求中) 24小时内有效
        cookie1.setMaxAge(24*60*60);
        cookie2.setMaxAge(24*60*60);
        response.addCookie(cookie1);
        response.addCookie(cookie2);
        //3.请求转发到 /getCookie 请求地址  forward:/getCookie
        //3.重定向到 /getCookie 请求地址  redirect:/getCookie
        return "redirect:/getCookie";
    }
    /*获取cookie*/
    @ResponseBody
    @GetMapping("/getCookie")
    public Map<String,Object> getCookie(
            @CookieValue(value = "username",required = false,defaultValue = "") String name,
            @CookieValue(value = "password",required = false,defaultValue = "") String pwd
    ){
        HashMap<String, Object> map = new HashMap<>();
        map.put("username",name);
        map.put("password",pwd);
        return map;
    }

//
    //========@RequestParam 获取请求参数========
    /*
    * @RequestParam 获取请求参数
    * 1.地址栏追加请求数据 url?name=zs&age=20&hobby=1&hobby=2
    * 2.表单数据        <input type="" name="key"> key代表的是请求参数名称
    * 3.如果想要一次性获取所有请求参数(包含同名的多个请求参数) 使用MultiValueMap
    * */
    @GetMapping("/requestparam")
    @ResponseBody
    public Map<String,Object> testRequestParam(
            @RequestPart MultipartFile file,
            @RequestParam(name = "name",required = false,defaultValue = "admin") String name,
            @RequestParam(name = "age",required = false,defaultValue = "18") int age,
            @RequestParam(name = "hobby") String[] hobby,
            @RequestParam MultiValueMap<String,Object> pv
    ){
        HashMap<String, Object> map = new HashMap<>();
        map.put("name",name);
        map.put("age",age);
        map.put("hobby", Arrays.toString(hobby));
        map.put("pv", pv);
        return map;
    }
//
    //========@RequestAttribute 获取request域属性========
    /*
    * Servlet 中的四大作用域: 存储共享数据（适用于前后端不分离）
    *   application（ServletContext）> session > request > page
    * */

    /*添加请求属性的数据*/
    @GetMapping("/addAttribute")
    public String testAddRequestAttribute(HttpServletRequest request){
        request.setAttribute("msg","hello Attribute");
        request.setAttribute("username","root");
        return "forward:/getAttribute";
    }

    /*
    获取请求属性中的数据
        @RequestAttribute（“key”） 等价于 request.getAttribute("key");
    */
    @GetMapping("/getAttribute")
    @ResponseBody
    public Map<String,Object> testGetRequestAttribute(
            HttpServletRequest request,
            @RequestAttribute(value = "msg",required = false) String msg2,
            @RequestAttribute(value = "username",required = false) String username){
        Object msg1 = request.getAttribute("msg");
        HashMap<String, Object> map = new HashMap<>();
        map.put("request&msg1",msg1);
        map.put("@RequestAttribute&msg2",msg2);
        map.put("username",username);
        return map;
    }


//
    //========@RequestBody 获取请求体[POST]========
    /*
    * @RequestBody : 将json格式的请求数据 转换为 java对象
    * @ResponseBody: 将要想要的结果java对象 转换为 json格式数据
    *
    * vue+v-model ==> 请求数据json
    * */
    @GetMapping("/getBody")
    @ResponseBody
    public User testRequestBody( User user){
        return user;
    }

//
    //========@MatrixVariable 矩阵变量    /userList.jsp;jessionId=xxxxx========


//
    //========@ModelAttribute 请求域中变量========
}
